﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using ClassLibraryEntidades;
using System.IO.Ports;
using System.Windows.Forms;

namespace SmartDeviceClient.Negocio
{
    public class LocalizadorGPS: Localizador
    {
        /// <summary>
        /// Simplemente implementa la interfaz, no hace nada esta propiedad.
        /// </summary>
        public Ruta RutaSeguida
        {
            get
            { return null; }
            set
            {}
        }

        public Transporte.TipoTransporte TipoTransporte
        {
            get
            {
                return Transporte.TipoTransporte.caminando;
            }
        }

        public enum Puerto
        {
            COM1,
            COM2,
            COM3,
            COM4,
            COM5,
            COM6,
            COM7,
            COM8,
            COM9
        }

        private string puerto;
        public Puerto PuertoSerie
        {
            set
            {
                switch (value)
                {
                    case Puerto.COM1:
                        puerto = "COM1";
                        break;
                    case Puerto.COM2:
                        puerto = "COM2";
                        break;
                    case Puerto.COM3:
                        puerto = "COM3";
                        break;
                    case Puerto.COM4:
                        puerto = "COM4";
                        break;
                    case Puerto.COM5:
                        puerto = "COM5";
                        break;
                    case Puerto.COM6:
                        puerto = "COM6";
                        break;
                    case Puerto.COM7:
                        puerto = "COM7";
                        break;
                    case Puerto.COM8:
                        puerto = "COM8";
                        break;
                    case Puerto.COM9:
                        puerto = "COM9";
                        break;
                    default:
                        puerto = "COM6";
                        break;
                }
            }
        }

        //Interpreta la información recibida del puerto serie.
        NmeaInterpreter interprete;

        //Puerto serie que obtiene la informacion del GPS.
        SerialPort puertoserie;


        public LocalizadorGPS()
        {
            this.PuertoSerie = Puerto.COM6;
            interprete = new NmeaInterpreter();
            //puertoserie = new SerialPort("COM6",9600,Parity.None,8,StopBits.One);
        }

        #region Localizador Members

        public Coordenada DamePosicion()
        {
            throw new NotImplementedException();
        }


        #endregion

        public string[] DamePosicionString(TextBox salida)
        {
            string[] coordenadas=new string[2];
            string datos;
                        
            if (puertoserie.IsOpen)
            {
                if (puertoserie.BytesToRead < 1)
                {
                    coordenadas[0] = "Sin señal";
                    coordenadas[1] = "Sin señal";
                    salida.Text += interprete.Latitude + "\n";
                    salida.Text += interprete.Longitude + "\n";
                    return coordenadas;
                }


                try
                {
                    //datos = "$GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25";
                    datos =puertoserie.ReadLine();
                }
                catch (Exception)
                {
                    coordenadas[0] = "Sin señal casca";
                    coordenadas[1] = "Sin señal casca";
                    salida.Text += interprete.Latitude + "\n";
                    salida.Text += interprete.Longitude + "\n";
                    return coordenadas;
                }


                try
                {
                    if (interprete.Parse(datos))
                    {
                        coordenadas[0] = interprete.Latitude;
                        coordenadas[1] = interprete.Longitude;
                        salida.Text += interprete.Latitude + "\n";
                        salida.Text += interprete.Longitude+"\n";
                    }
                }
                catch (Exception)
                {
                    this.CerrarPuerto();
                    //throw ex;
                }
            }
            return coordenadas;
        }

        public bool AbrirPuerto()
        {
            try
            {
                puertoserie.Open();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        public bool CerrarPuerto()
        {
            try
            {
                puertoserie.Close();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        

        private Coordenada MapeaCoordenada(string latitud, string longitud)
        {
            return new Coordenada(40,40);
        }


        

    }
}
